package org.roin.util;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * Hello world!
 */
public class App {
    public static void main(String[] args) throws IOException, TemplateException {
        String templatesDir = App.class.getClassLoader().getResource("templates").getPath();//获取文件路径
        String outDir = App.class.getClassLoader().getResource("").getPath()+File.separator+"out";//获取生成文件输出目录

        Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
        cfg.setDirectoryForTemplateLoading(new File(templatesDir));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        //生成Controller
        generateController(cfg,outDir,"cn.roin.prod.websitetemplate","SysRole","role","角色管理","role");
        //生成Service
        generateService(cfg,outDir,"cn.roin.prod.websitetemplate","SysRole","角色管理");
        //生成ServiceImpl
        generateServiceImpl(cfg,outDir,"cn.roin.prod.websitetemplate","SysRole","role","角色管理");

    }

    /**
     * 生成Controler
     * @param cfg 模板配置实例
     * @param outDir 生成文件目录
     * @param packageName 项目包名，如：cn.roin.prod.websitetemplate
     * @param beanClassName 实体类名，如：User
     * @param beanName 实体类实例名，如user,用于生成xxxServicea及实体类参数实例
     * @param name 业务功能名称,如：用户管理
     * @param path 业务访问路径，如：/userManager
     * @throws IOException
     * @throws TemplateException
     */
    public static void generateController(Configuration cfg,String outDir,String packageName,String beanClassName,
                                          String beanName,String name,String path) throws IOException,
            TemplateException {
        //获取模板
        Template temp = cfg.getTemplate("Controller.ftl");
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("packageName", packageName);
        root.put("beanClassName", beanClassName);
        root.put("beanName", beanName);
        root.put("name", name);
        root.put("path", path);

        File dir = new File(outDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        OutputStream fos = new FileOutputStream(new File(dir, beanClassName+"Controller.java")); //java文件的生成目录
        Writer out = new OutputStreamWriter(fos);
        temp.process(root, out);
        fos.flush();
        fos.close();
        System.out.println("generate Controller success!");
    }
    /**
     * 生成业务接口（Service）
     * @param cfg 模板配置实例
     * @param outDir 生成文件目录
     * @param packageName 项目包名，如：cn.roin.prod.websitetemplate
     * @param beanClassName 实体类名，如：User
     * @param name 业务功能名称,如：用户管理
     * @throws IOException
     * @throws TemplateException
     */
    public static void generateService(Configuration cfg,String outDir,String packageName,String beanClassName,String name) throws IOException,
            TemplateException {
        //获取模板
        Template temp = cfg.getTemplate("Service.ftl");
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("packageName", packageName);
        root.put("beanClassName", beanClassName);
        root.put("name", name);

        File dir = new File(outDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        OutputStream fos = new FileOutputStream(new File(dir, beanClassName+"Service.java")); //java文件的生成目录
        Writer out = new OutputStreamWriter(fos);
        temp.process(root, out);
        fos.flush();
        fos.close();
        System.out.println("generate Service success!");
    }
    /**
     * 生成业务实现类（ServiceImpl）
     * @param cfg 模板配置实例
     * @param outDir 生成文件目录
     * @param packageName 项目包名，如：cn.roin.prod.websitetemplate
     * @param beanClassName 实体类名，如：User
     * @param beanName 实体类实例名，如user,用于生成xxxServicea及实体类参数实例
     * @param name 业务功能名称,如：用户管理
     * @throws IOException
     * @throws TemplateException
     */
    public static void generateServiceImpl(Configuration cfg,String outDir,String packageName,String beanClassName,
                                          String beanName,String name) throws IOException,
            TemplateException {
        //获取模板
        Template temp = cfg.getTemplate("ServiceImpl.ftl");
        Map<String, Object> root = new HashMap<String, Object>();
        root.put("packageName", packageName);
        root.put("beanClassName", beanClassName);
        root.put("beanName", beanName);
        root.put("name", name);

        File dir = new File(outDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        OutputStream fos = new FileOutputStream(new File(dir, beanClassName+"ServiceImpl.java")); //java文件的生成目录
        Writer out = new OutputStreamWriter(fos);
        temp.process(root, out);
        fos.flush();
        fos.close();
        System.out.println("generate ServiceImpl success!");
    }
}
